/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package testaSPARQL;

import com.hp.hpl.jena.db.DBConnection;
import com.hp.hpl.jena.db.IDBConnection;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.ResultSetFormatter;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.ModelMaker;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.sparql.engine.ResultSetStream;
import java.io.IOException;
//import opennlp.tools.lang.english.PosTagger;

/**
 *
 * @author Filipe
 */
public class Main {
    // database URL

    static String M_DB_URL = "jdbc:mysql://localhost:3309/wsdb";
    // User name
    static String M_DB_USER = "ws";
    // Password
    static String M_DB_PASSWD = "ws";
    // Database engine name
    static String M_DB = "MySQL";
    // JDBC driver
    static String M_DBDRIVER_CLASS = "com.mysql.jdbc.Driver";
    static String URI = "http://www.owl-ontologies.com/javadoc_renteBK2008WS.owl#";
    static String PREFIX = "PREFIX nosso: <" + URI + ">" +
            " PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> " +
            "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> ";
    static String inputFileName = "JavadocOntologia.owl";    // Properties

    static Property propNomeFicheiro;
    static Property propDataModific;
    static Property propTamanho;
    static String select,  nTriples,  queryString;
    private static String queryTudo,  queryFicheiro,  queryClasse,  queryMetodo;

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) throws IOException {

        try {

            // load the the driver class
            Class.forName(M_DBDRIVER_CLASS);
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        // create a database connection
        IDBConnection conn = new DBConnection(M_DB_URL, M_DB_USER, M_DB_PASSWD, M_DB);

        // create a model maker with the given connection parameters
        ModelMaker maker = ModelFactory.createModelRDBMaker(conn);

        //or open a previously created named model
        Model nmModel = maker.openModel("MyWSModel");

        //############################
        //GUARDAR ISTO
        //############################
        //        System.out.println("MODELO NULO ABERTO");
        //
        //        //Apaga os modelos existentes
        //        ExtendedIterator extI = null;
        //        try {
        //            extI = maker.listModels();
        //        } catch (Exception e) {
        //            System.out.println("DB inacessivel");
        //            return false;
        //        }
        //        while (extI.hasNext()) {
        //            maker.removeModel((String) extI.next());
        //        }
        //        maker = ModelFactory.createModelRDBMaker(conn);
        //        // or create a named model
        //        nmModel = maker.createModel("MyWSModel");
        //############################
        //fim de GUARDAR ISTO
        //############################



        String queryFicheiroFinal = PREFIX +
                " SELECT DISTINCT ?Nome_ficheiro ?Caminho ?Ficheiro " +
                " WHERE { " +
                " ?Ficheiro nosso:Nome_ficheiro ?Nome_ficheiro ; " +
                " nosso:Tamanho ?Tamanho ; " +
                " nosso:Caminho ?Caminho . "+
                " FILTER regex(str(?Tamanho), '38442', 'i' ) " +
                " }";

        String queryClasseFinal = PREFIX +
                " SELECT DISTINCT ?Nome_da_classe ?Descricao ?Deprecated ?pa ?Throws_exception ?vrs ?Ver_tambem ?Desde_versao " +
                " WHERE {" +
                " ?idClasse nosso:Nome_da_classe ?Nome_da_classe ;" +
                " OPTIONAL { ?idClasse nosso:Autor ?Autor } ." +
                " OPTIONAL { ?idClasse nosso:Versao ?vrs } ." +
                " OPTIONAL { ?idClasse nosso:Desde_versao ?since } ." +
                " ?idClasse  nosso:hasPackage ?p . " +
                " OPTIONAL {  ?p nosso:package_name ?pa } ." +
                " OPTIONAL { ?idClasse nosso:Deprecated ?Deprecated } ." +
                " OPTIONAL { ?idClasse nosso:Desde_versao ?Desde_versao } ." +
                " OPTIONAL { ?idClasse nosso:Descricao ?Descricao } ." +
                " OPTIONAL { ?idClasse nosso:Throws_exception ?Throws_exception } ." +
                " OPTIONAL { ?idClasse nosso:Ver_tambem ?Ver_tambem } ." +
                " FILTER regex(str(?idClasse), 'http://www.owl-ontologies.com/javadoc_renteBK2008WS.owl#WS_0', 'i' ) " +
                " }";
        
        String queryClasse2 = PREFIX +
                " SELECT DISTINCT ?idClasse ?Nome_da_classe " +
                " WHERE {" +
                " ?idFile nosso:temClasse ?idClasse ." +
                " ?idClasse nosso:Nome_da_classe ?Nome_da_classe ;" +
                " FILTER regex(str(?idFile), 'http://www.owl-ontologies.com/javadoc_renteBK2008WS.owl#WS_0', 'i' ) " +
                " }";
        
        String queryMetodo2 = PREFIX +
                "SELECT DISTINCT  ?idMetodo ?Nome_do_metodo " +
                " WHERE {" +
                " ?idFile nosso:temClasse ?idClasse ." +
                " ?idClasse nosso:temMetodo ?idMetodo ." +
                " ?idMetodo nosso:Nome_do_metodo ?Nome_do_metodo ." +
                " FILTER regex(str(?idFile), 'http://www.owl-ontologies.com/javadoc_renteBK2008WS.owl#WS_0', 'i' ) " +
                " }";
        

        String queryMetodoFinal = PREFIX +" SELECT DISTINCT ?Nome_do_metodo ?Descricao ?Valor_de_retorno ?pa ?Deprecated ?Throws_exception " +
                    " WHERE {" +
                    " ?idMetodo nosso:Nome_do_metodo ?Nome_do_metodo ." +
                    " OPTIONAL { ?idMetodo nosso:Throws_exception ?Throws_exception } ." +
                    " OPTIONAL { ?idMetodo nosso:Deprecated ?Deprecated } ." +
                    " OPTIONAL { ?idMetodo nosso:Descricao_do_metodo ?Descricao } ." +
                    " OPTIONAL { ?idMetodo nosso:Valor_de_retorno ?Valor_de_retorno } ." +
                    " OPTIONAL { ?idMetodo nosso:temParametros ?p } . " +
                    " OPTIONAL { ?p nosso:Nome_param_entrada ?pa } ." +
                    " FILTER regex(str(?idMetodo), 'http://www.owl-ontologies.com/javadoc_renteBK2008WS.owl#WS_5Vector0java.util0trimToSize5', 'i' ) " +
                    " }";


        String queryAutor = PREFIX +
                " SELECT DISTINCT ?Nome_ficheiro ?caminho" +
                " WHERE {" +
                " ?f nosso:Nome_ficheiro ?Nome_ficheiro . " +
                " ?c nosso:Nome_da_classe ?Nome_da_classe ." +
                " ?f nosso:temClasse ?c ." +
                " ?f nosso:Caminho ?caminho . " +
                " ?c nosso:Autor ?Autor ." +
                " FILTER regex(str(?Autor), 'Neal Gafter', 'i' ) " +
                " }";

        String queryPackage = PREFIX +
                " SELECT DISTINCT ?Nome_ficheiro ?caminho" +
                " WHERE {" +
                " ?f nosso:Nome_ficheiro ?Nome_ficheiro . " +
                " ?c nosso:Nome_da_classe ?Nome_da_classe ." +
                " ?f nosso:temClasse ?c . " +
                " ?f nosso:Caminho ?caminho . " +
                " ?c nosso:hasPackage ?p ." +
                " ?p nosso:package_name ?pa ." +
                " FILTER regex(str(?pa), 'util', 'i' ) " +
                " }";
        
        String queryTMP = PREFIX +
                "SELECT DISTINCT ?f ?tamanho ?data ?Autor ?pa ?Nome_da_classe ?metodo " +
                    " WHERE {" +
                    " ?f nosso:Nome_ficheiro ?file ;" +
                    " nosso:Tamanho ?tamanho ;" +
                    " nosso:Data_de_modificacao ?data ." +
                    " OPTIONAL{ ?c nosso:Nome_da_classe ?Nome_da_classe }." +
                    " ?f nosso:temClasse ?c . " +
                    " OPTIONAL{ ?c nosso:Autor ?Autor }." +
                    " OPTIONAL{ ?c nosso:hasPackage ?p }." +
                    " OPTIONAL{ ?p nosso:package_name ?pa }." +
                    " OPTIONAL{ ?c nosso:temMetodo ?m }." +
                    " OPTIONAL{ ?m nosso:Nome_do_metodo ?metodo }." +
                    " FILTER regex(str(?f), 'http://www.owl-ontologies.com/javadoc_renteBK2008WS.owl#WS_0', 'i' ) " +
                    " }";
        
        ResultSet rs = executaQuery(queryFicheiroFinal, nmModel);
  

    }

    static String transformaQuery(String tipo, String token) {
        String ret = "";
        if (tipo.equals("ficheiro")) {
            ret = queryFicheiro;
        } else if (tipo.equals("classe")) {
            ret = queryClasse;
        } else if (tipo.equals("metodo")) {
            ret = fazQueryMetodo(token);
        }

//        ret += " FILTER regex(str(?Nome_do_metodo),'" + token + "')  ";
//        ret += " FILTER regex(str(?temParametros),'" + token + "') ";
//        ret += " FILTER regex(str(?Throws_exception),'" + token + "') ";
//        ret += " FILTER regex(str(?Valor_de_retorno),'" + token + "') ";
//        ret += " FILTER regex(str(?Deprecated),'" + token + "') ";
//        ret += " FILTER regex(str(?Descricao_do_metodo),'" + token + "') .";



        return ret;




    }

    private static ResultSet executaQuery(String s, Model m) {
        //String queryString = PREFIX + "\n SELECT " +  select + "\n WHERE {" + nTriples + ". }";

        com.hp.hpl.jena.query.Query query = QueryFactory.create(s);

        // Execute the query and obtain results
        QueryExecution qe = QueryExecutionFactory.create(s, m);
        ResultSetStream rs = (ResultSetStream) qe.execSelect();

//        while (rs.hasNext()) {
//            ResultBinding next = (ResultBinding) rs.next();
//            System.out.print(next.get("file"));
//            System.out.print(" | ");
//            System.out.print(next.get("metodo"));
//            System.out.print(" | ");
//            System.out.println(next.get("Autor"));
//        }



        //WORKS MOELAS!!!!!
//        System.out.println(rs.hasNext());
//        Hashtable<String, String> data = new Hashtable();
//        List<String> vars = rs.getResultVars();
//        for (String nomeColuna : vars) {
//            System.out.print(nomeColuna + " \t");
//        }
//        System.out.println("");
//        ArrayList<String> stuff = new ArrayList<String>();
//        while (rs.hasNext()) {
//            ResultBinding next = (ResultBinding) rs.next();
//            for (String nomeColuna : vars) {
//                String valor = next.get(nomeColuna).toString();
//                System.out.print(valor + " | \t");
//                stuff.add(valor);
//                data.put(nomeColuna, valor);
//            }
//            System.out.println("");
//        }
//
//        System.out.println("\n\n\nHASH: " + data.size());
//
//
//
//        System.out.println(rs.hasNext());
        ResultSetFormatter.out(System.out, rs);
//        System.out.println(rs.hasNext());
//        String st = ResultSetFormatter.asXMLString(results, "");
// Output query results	

        //    System.out.println("em XML: " + st);
// Important - free up resources used running the query
        qe.close();
        return rs;
    }

    private static String fazQueryMetodo(String token) {
        queryMetodo = PREFIX +
                " SELECT ?Nome_ficheiro " +
                " WHERE {" +
                " ?metodo nosso:Nome_do_metodo ?Nome_do_metodo" +
                " FILTER regex(str(?Nome_do_metodo),'" + token + "')" +
                " ?classe nosso:temMetodo ?metodo . " +
                " ?ficheiro nosso:temClasse ?classe ." +
                " ?ficheiro nosso:Nome_ficheiro ?Nome_ficheiro ." +
                "";
        return "";
    }
}
 


